From d0b73a0b8fca2f9c0ee6253954920f9bd142cba6 Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Mon, 27 Jul 2020 15:25:22 -0600 Subject: [PATCH] support third party library configuration in qmake (#611) * add qmake options to specify libraries. * fix no libusb along lines of #610 * correct inclusion of shapelib headers. * more closely match original includes instead of trying to use HAVE_*, ENABLED_* *_INHIBITED and -I options in a consistent manner. We can revisit this after the demise of configure. * add qmake message when libusb is disabled. --- GPSBabel.pro | 68 ++++++++------------------------------------- jeeps/gpslibusb.cc | 9 ++++++ jeeps/gpsusbstub.cc | 1 - libusb.pri | 65 +++++++++++++++++++++++++++++++++++++++++++ shape.cc | 8 ++++-- shape.h | 8 ++++-- shapelib.pri | 22 +++++++++++++++ zlib.pri | 47 +++++++++++++++++++++++++++++++ 8 files changed, 166 insertions(+), 62 deletions(-) create mode 100644 libusb.pri create mode 100644 shapelib.pri create mode 100644 zlib.pri diff --git a/GPSBabel.pro b/GPSBabel.pro index 3e1ca1573..944422206 100644 --- a/GPSBabel.pro +++ b/GPSBabel.pro @@ -10,7 +10,7 @@ count(MIN_QT_VERSION_PATCH, 0): MIN_QT_VERSION_PATCH = 0 lessThan(QT_MAJOR_VERSION, $$MIN_QT_VERSION_MAJOR) | \ if(equals(QT_MAJOR_VERSION, $$MIN_QT_VERSION_MAJOR):lessThan(QT_MINOR_VERSION, $$MIN_QT_VERSION_MINOR)) | \ if(equals(QT_MAJOR_VERSION, $$MIN_QT_VERSION_MAJOR):equals(QT_MINOR_VERSION, $$MIN_QT_VERSION_MINOR):lessThan(QT_PATCH_VERSION, $$MIN_QT_VERSION_PATCH)) { - error("$$QMAKE_QMAKE uses Qt version $$QT_VERSION but version $${MIN_QT_VERSION_MAJOR}.$${MIN_QT_VERSION_MINOR}.$${MIN_QT_VERSION_PATCH} or newer is required.") + error("$$QMAKE_QMAKE uses Qt version $$QT_VERSION but version $${MIN_QT_VERSION_MAJOR}.$${MIN_QT_VERSION_MINOR}.$${MIN_QT_VERSION_PATCH} or newer is required.") } QT -= gui @@ -20,6 +20,7 @@ TARGET = gpsbabel CONFIG += console CONFIG -= app_bundle CONFIG += c++14 +CONFIG += link_pkgconfig TEMPLATE = app @@ -61,13 +62,6 @@ FILTERS=position.cc radius.cc duplicate.cc arcdist.cc polygon.cc smplrout.cc \ FILTER_HEADERS = $$FILTERS FILTER_HEADERS ~= s/\.cc/.h/g -SHAPE=shapelib/shpopen.c shapelib/dbfopen.c shapelib/safileio.c - -ZLIB=zlib/adler32.c zlib/compress.c zlib/crc32.c zlib/deflate.c zlib/inffast.c \ - zlib/inflate.c zlib/infback.c zlib/inftrees.c zlib/trees.c \ - zlib/uncompr.c zlib/gzlib.c zlib/gzclose.c zlib/gzread.c \ - zlib/gzwrite.c zlib/zutil.c - JEEPS += jeeps/gpsapp.cc jeeps/gpscom.cc \ jeeps/gpsmath.cc jeeps/gpsmem.cc \ jeeps/gpsprot.cc jeeps/gpsread.cc \ @@ -84,7 +78,7 @@ SUPPORT = route.cc waypt.cc filter_vecs.cc util.cc vecs.cc mkshort.cc \ gbfile.cc parse.cc session.cc main.cc globals.cc \ src/core/textstream.cc \ src/core/usasciicodec.cc \ - src/core/xmlstreamwriter.cc + src/core/xmlstreamwriter.cc HEADERS = \ an1sym.h \ @@ -147,7 +141,6 @@ HEADERS = \ random.h \ session.h \ shape.h \ - shapelib/shapefil.h \ strptime.h \ subrip.h \ unicsv.h \ @@ -156,17 +149,6 @@ HEADERS = \ xcsv.h \ xmlgeneric.h \ yahoo.h \ - zlib/crc32.h \ - zlib/deflate.h \ - zlib/gzguts.h \ - zlib/inffast.h \ - zlib/inffixed.h \ - zlib/inflate.h \ - zlib/inftrees.h \ - zlib/trees.h \ - zlib/zconf.h \ - zlib/zlib.h \ - zlib/zutil.h \ src/core/datetime.h \ src/core/file.h \ src/core/logging.h \ @@ -178,8 +160,6 @@ HEADERS = \ HEADERS += $$FILTER_HEADERS -INCLUDEPATH += zlib - load(configure) CONFIG(release, debug|release): DEFINES *= NDEBUG @@ -193,23 +173,21 @@ macx|linux|openbsd { # this is used by zlib DEFINES += HAVE_STDARG_H } - DEFINES += HAVE_LIBUSB_1_0 SOURCES += gbser_posix.cc HEADERS += gbser_posix.h - JEEPS += jeeps/gpslibusb.cc INCLUDEPATH += jeeps } win32 { DEFINES += __WIN32__ _CONSOLE - DEFINES -= UNICODE ZLIB_INHIBITED + DEFINES -= UNICODE CONFIG(debug, debug|release) { DEFINES += _DEBUG } SOURCES += gbser_win.cc HEADERS += gbser_win.h JEEPS += jeeps/gpsusbwin.cc - LIBS += "-lsetupapi" + LIBS += "-lsetupapi" RC_FILE = win32/gpsbabel.rc } @@ -218,39 +196,15 @@ win32-msvc* { QMAKE_CXXFLAGS += /MP -wd4100 } -linux|openbsd { - LIBS += "-lusb-1.0" -} - -macx { - LIBS += -lobjc -framework IOKit -framework CoreFoundation - INCLUDEPATH += mac/libusb \ - mac/libusb/Xcode - SOURCES += mac/libusb/core.c \ - mac/libusb/descriptor.c \ - mac/libusb/hotplug.c \ - mac/libusb/io.c \ - mac/libusb/strerror.c \ - mac/libusb/sync.c \ - mac/libusb/os/darwin_usb.c \ - mac/libusb/os/poll_posix.c \ - mac/libusb/os/threads_posix.c - HEADERS += mac/libusb/hotplug.h \ - mac/libusb/libusb.h \ - mac/libusb/libusbi.h \ - mac/libusb/version.h \ - mac/libusb/version_nano.h \ - mac/libusb/os/darwin_usb.h \ - mac/libusb/os/poll_posix.h \ - mac/libusb/os/threads_posix.h -} +include(shapelib.pri) +include(zlib.pri) +include(libusb.pri) -SOURCES += $$ALL_FMTS $$FILTERS $$SUPPORT $$SHAPE $$ZLIB $$JEEPS +SOURCES += $$ALL_FMTS $$FILTERS $$SUPPORT $$JEEPS # We don't care about stripping things out of the build. Full monty, baby. DEFINES += MAXIMAL_ENABLED DEFINES += FILTERS_ENABLED -DEFINES += SHAPELIB_ENABLED DEFINES += CSVFMTS_ENABLED # Creator insists on adding -W to -Wall which results in a completely @@ -278,7 +232,7 @@ macx|linux|openbsd{ # example usage: # make clang-tidy RUN_CLANG_TIDY_FLAGS="-header-filter=.*\\\.h -checks=-*,modernize-use-nullptr -fix" # It seems to be better to use run-clang-tidy with the compilation database as opposed to -# running clang-tidy directly and listing the +# running clang-tidy directly and listing the # compilation options on the clang-tidy line after --. # An example is modernize-use-override which inserts repeadted overrides when run directly, # but works as expected when run with run-clang-tidy. @@ -306,7 +260,7 @@ cppcheck.commands = cppcheck --enable=all --force --config-exclude=zlib --config QMAKE_EXTRA_TARGETS += cppcheck gpsbabel.pdf.depends = FORCE -gpsbabel.pdf.commands += perl xmldoc/makedoc && +gpsbabel.pdf.commands += perl xmldoc/makedoc && gpsbabel.pdf.commands += xmlwf xmldoc/readme.xml && #check for well-formedness gpsbabel.pdf.commands += xmllint --noout --valid xmldoc/readme.xml && #validate gpsbabel.pdf.commands += xsltproc -o gpsbabel.fo xmldoc/babelpdf.xsl xmldoc/readme.xml && diff --git a/jeeps/gpslibusb.cc b/jeeps/gpslibusb.cc index 3de965003..bcdd8d141 100644 --- a/jeeps/gpslibusb.cc +++ b/jeeps/gpslibusb.cc @@ -28,12 +28,21 @@ #include "config.h" #endif #if HAVE_LIBUSB_1_0 +#ifdef LIBUSB_H_INCLUDE +// Warning: LIBUSB_H_INCLUDE necessarily includes bracket or double quote +// characters. +// qmake -tp vc doesn't properly quote these characters, and the +// produced project file is invalid. However, we don't use libusb +// at all on windows, so this isn't an issue in this application. +# include LIBUSB_H_INCLUDE +#else // TODO: delete this clause when configure is removed and CMakeLists updated. # if __APPLE__ // We use our own libusb. # include "mac/libusb/libusb.h" # else # include # endif +#endif #include "../defs.h" #include "garminusb.h" #include "gpsdevice.h" diff --git a/jeeps/gpsusbstub.cc b/jeeps/gpsusbstub.cc index 9be709380..8ffea63e9 100644 --- a/jeeps/gpsusbstub.cc +++ b/jeeps/gpsusbstub.cc @@ -25,7 +25,6 @@ #endif #include "../defs.h" -#include "src/core/logging.h" #if !HAVE_LIBUSB_1_0 diff --git a/libusb.pri b/libusb.pri new file mode 100644 index 000000000..477929185 --- /dev/null +++ b/libusb.pri @@ -0,0 +1,65 @@ +macx|linux|openbsd { + !defined(WITH_LIBUSB, var) { + macx: WITH_LIBUSB = included + linux|openbsd: WITH_LIBUSB = system + } + equals(WITH_LIBUSB, no) { + message("libusb-1.0 disabled") + JEEPS += jeeps/gpsusbstub.cc + } else { + DEFINES += HAVE_LIBUSB_1_0 + JEEPS += jeeps/gpslibusb.cc + equals(WITH_LIBUSB, pkgconfig) { + message("Using libusb-1.0 found by pkg-config") + PKGCONFIG += libusb-1.0 + DEFINES += LIBUSB_H_INCLUDE=$$shell_quote() + } else { + linux|openbsd { + equals(WITH_LIBUSB, system) { + LIBS += "-lusb-1.0" + DEFINES += LIBUSB_H_INCLUDE=$$shell_quote() + } else:equals(WITH_LIBUSB, custom) { + message("libusb-1.0 is enabled but but must be manually configured") + message(" e.g. qmake WITH_LIBUSB=custom LIBS+=... INCLUDEPATH+=...") + DEFINES += LIBUSB_H_INCLUDE=$$shell_quote() + } else { + error("WITH_LIBUSB=no|pkgconfig|system*|custom"); + } + } + + macx { + equals(WITH_LIBUSB, included) { + # TODO: It would be better to create an archive and link to it + # to separate library build requirements from gpsbabel requirements. + DEFINES += LIBUSB_H_INCLUDE=$$shell_quote(\"mac/libusb/libusb.h\") + LIBS += -lobjc -framework IOKit -framework CoreFoundation + INCLUDEPATH += mac/libusb \ + mac/libusb/Xcode + SOURCES += mac/libusb/core.c \ + mac/libusb/descriptor.c \ + mac/libusb/hotplug.c \ + mac/libusb/io.c \ + mac/libusb/strerror.c \ + mac/libusb/sync.c \ + mac/libusb/os/darwin_usb.c \ + mac/libusb/os/poll_posix.c \ + mac/libusb/os/threads_posix.c + HEADERS += mac/libusb/hotplug.h \ + mac/libusb/libusb.h \ + mac/libusb/libusbi.h \ + mac/libusb/version.h \ + mac/libusb/version_nano.h \ + mac/libusb/os/darwin_usb.h \ + mac/libusb/os/poll_posix.h \ + mac/libusb/os/threads_posix.h + } else:equals(WITH_LIBUSB, custom) { + message("libusb-1.0 is enabled but but must be manually configured") + message(" e.g. qmake WITH_LIBUSB=custom LIBS+=... INCLUDEPATH+=...") + DEFINES += LIBUSB_H_INCLUDE=$$shell_quote() + } else { + error("WITH_LIBUSB=no|pkgconfig|included*|custom"); + } + } + } + } +} diff --git a/shape.cc b/shape.cc index 933eb95a4..139a7ee9d 100644 --- a/shape.cc +++ b/shape.cc @@ -32,10 +32,14 @@ #include "defs.h" #include "shape.h" -#include "shapelib/shapefil.h" +#if SHAPELIB_ENABLED +#if HAVE_LIBSHAPE +# include +#else +# include "shapelib/shapefil.h" +#endif -#if SHAPELIB_ENABLED #define MYNAME "shape" /************************************************************************/ diff --git a/shape.h b/shape.h index 0ce05af7c..38c1208c0 100644 --- a/shape.h +++ b/shape.h @@ -27,10 +27,14 @@ #include "defs.h" // for arglist_t, ARGTYPE_STRING, Waypoint, route_head, CET_CHARSET_ASCII, FF_CAP_RW_ALL, ff_cap, ff_type, ff_type_file #include "format.h" // for Format -#include "shapelib/shapefil.h" // for DBFHandle, SHPAPI_CALL, SHPHandle +#if SHAPELIB_ENABLED +#if HAVE_LIBSHAPE +# include +#else +# include "shapelib/shapefil.h" // for DBFHandle, SHPAPI_CALL, SHPHandle +#endif -#if SHAPELIB_ENABLED class ShapeFormat : public Format { public: diff --git a/shapelib.pri b/shapelib.pri new file mode 100644 index 000000000..806c2966e --- /dev/null +++ b/shapelib.pri @@ -0,0 +1,22 @@ +!defined(WITH_SHAPELIB, var):WITH_SHAPELIB = included +equals(WITH_SHAPELIB, no) { + message("shapelib disabled") +} else { + DEFINES += SHAPELIB_ENABLED + equals(WITH_SHAPELIB, pkgconfig) { + message("Using shapelib found by pkg-config") + PKGCONFIG += shapelib + DEFINES += HAVE_LIBSHAPE + } else:equals(WITH_SHAPELIB, included) { + # TODO: It would be better to create an archive and link to it + # to separate library build requirements from gpsbabel requirements. + SOURCES += shapelib/shpopen.c shapelib/dbfopen.c shapelib/safileio.c + HEADERS += shapelib/shapefil.h + } else:equals(WITH_SHAPELIB, custom) { + message("shapelib is enabled but but must be manually configured") + message(" e.g. qmake WITH_SHAPELIB=custom LIBS+=... INCLUDEPATH+=...") + DEFINES += HAVE_LIBSHAPE + } else { + error("WITH_SHAPELIB=no|pkgconfig|included*|custom"); + } +} diff --git a/zlib.pri b/zlib.pri new file mode 100644 index 000000000..36dcbb0c4 --- /dev/null +++ b/zlib.pri @@ -0,0 +1,47 @@ +!defined(WITH_ZLIB, var):WITH_ZLIB = included +equals(WITH_ZLIB, no) { + message("zlib disabled") + DEFINES += ZLIB_INHIBITED +} else { + equals(WITH_ZLIB, pkgconfig) { + message("Using zlib found by pkg-config") + PKGCONFIG += $$shell_quote(zlib > 1.2.8) + DEFINES += HAVE_LIBZ + } else:equals(WITH_ZLIB, included) { + # TODO: It would be better to create an archive and link to it + # to separate library build requirements from gpsbabel requirements. + SOURCES += zlib/adler32.c \ + zlib/compress.c \ + zlib/crc32.c \ + zlib/deflate.c \ + zlib/inffast.c \ + zlib/inflate.c \ + zlib/infback.c \ + zlib/inftrees.c \ + zlib/trees.c \ + zlib/uncompr.c \ + zlib/gzlib.c \ + zlib/gzclose.c \ + zlib/gzread.c \ + zlib/gzwrite.c \ + zlib/zutil.c + INCLUDEPATH += zlib + HEADERS += zlib/crc32.h \ + zlib/deflate.h \ + zlib/gzguts.h \ + zlib/inffast.h \ + zlib/inffixed.h \ + zlib/inflate.h \ + zlib/inftrees.h \ + zlib/trees.h \ + zlib/zconf.h \ + zlib/zlib.h \ + zlib/zutil.h + } else:equals(WITH_ZLIB, custom) { + message("zlib is enabled but but must be manually configured") + message(" e.g. qmake WITH_ZLIB=custom LIBS+=... INCLUDEPATH+=...") + DEFINES += HAVE_LIBZ + } else { + error("WITH_ZLIB=no|pkgconfig|included*|custom"); + } +} -- 2.30.2